草庐IT

Java OutOfMemoryError 奇怪的行为

全部标签

c++ - 窗口未最大化时丢失 WM_NCLBUTTONUP 消息的奇怪问题

我有一个处理WM_NCLBUTTONUP消息的窗口,以便处理对标题栏中自定义按钮的点击。这在窗口最大化时效果很好,但当它没有最大化时,WM_NCLBUTTONUP消息永远不会到达!我确实收到了WM_NCLBUTTONDOWN消息。奇怪的是,如果我单击菜单栏右侧,WM_NCLBUTTONUP确实会到达,但在标题栏/窗口框架的任何位置,消息永远不会到达。调试一段时间后发现如果在CMainFrame::OnNcLButtonDown()上设置断点,点击标题栏,但按住鼠标不放,让调试器在函数中断点,按F5继续调试,然后释放鼠标按钮-神奇地发送WM_NCLBUTTONUP!!我的问题有两个方面:

C++ 类设计为每个不同的行为提供多个接口(interface)

这是我的第一篇文章,所以请善待。这是我最近得到的一个面试问题,但我在搜索(google、C++FAQ等)后找不到答案。有一个行为b1()的接口(interface)I1。有3个类A,B,C。所有这些类都通过覆盖b1()来实现接口(interface)I1。有第四个类D,它具有在接口(interface)I1中定义的行为(b1)和一个额外的行为b2问题是你如何设计D类。我的答案是创建另一个接口(interface)I2,它定义行为b2()并通过覆盖b1()和b2()使类D实现I1和I2(C++中的多重继承)面试官同意这个解决方案,但问如果将来出现具有新行为的新类(class),我们将如何

c++ - 未命名对象的 RVO(返回值优化)是否是普遍保证的行为?

Thisquestion在不同方面(也仅限于gcc)。我的问题仅适用于未命名对象。ReturnValueOptimization被允许改变结果程序的可观察行为。标准中似乎也提到了这一点。但是,这个“允许”术语令人困惑。这是否意味着RVO保证在每个编译器上发生。由于RVO下面的代码改变了它的可观察行为:#includeintglobal=0;structA{A(int*p){}A(constA&obj){++global;}};Afoo(){returnA(0);}//这个程序是否应该为所有实现打印global=0,而不考虑编译器优化和foo的方法大小? 最佳

c++ - 如果表达式的中间结果溢出,是否是未定义行为?

这个问题是另一个SOquestion的结果.示例代码#includeintmain(){unsignedlongb=35000000;inti=100;intj=30000000;unsignedlongn=(i*j)/b;//#1unsignedlongm=(100*30000000)/b;//#2std::cout输出8585使用g++-std=c++11-Wall-pedantic-O0-Wextra编译此代码会给出以下警告:9:28:警告:表达式[-Woverflow]中的整数溢出问题我认为#1和#2调用未定义行为是否正确,因为中间结果100*30000000没有适合int?还

c++ - 对象数组的默认复制行为

如果我有一个以数组作为成员的类:classA{Objectarray[SIZE];};然后我复制它的一个实例:Aa;Ab=a;Ac;c=a;array是逐字节memcpy还是Object::operator=逐元素复制? 最佳答案 C++中的数组对于所有一等对象都表现良好,包括用户定义的类型(无论它们是否是POD/非平凡可构造的)。#includestructObject{Object(){puts("Object");}Object(Objectconst&){puts("copy");}~Object(){puts("~Obje

c++ - std::string s() 奇怪的行为

这个问题在这里已经有了答案:Whyistherenocalltotheconstructor?[duplicate](3个答案)关闭9年前。我发现了一些我不明白的奇怪东西。std::stringa();打印出来时返回1。我不知道它是从哪里来的。我认为a()是一个没有参数的构造函数,但看起来它不是。我在哪里可以找到这方面的信息?这是什么?当尝试执行std::stringb(a);时,编译器会提示:error:nomatchingfunctionforcallto‘std::basic_string::basic_string(std::string(&)())’解释将不胜感激。

c++ - 如何自定义未捕获的异常终止行为?

在g++和clang++中(至少在Linux中)在抛出异常但未捕获异常(未捕获的异常)后显示以下典型消息:terminatecalledafterthrowinganinstanceof'std::runtime_error'what():Bye例如:#includeintmain(){throwstd::runtime_error("Bye");}如何自定义错误消息,同时仍然可以完全访问抛出的异常?文档(http://www.cplusplus.com/reference/exception/set_unexpected/)提到了set_unexpected(和set_termina

C++缓存性能奇怪的行为

我读了一篇文章(1.5岁的http://www.drdobbs.com/parallel/cache-friendly-code-solving-manycores-ne/240012736),其中谈到了缓存性能和数据大小。他们显示了以下代码,他们说它们在i7(桑迪桥)上运行staticvolatileintarray[Size];staticvoidtest_function(void){for(inti=0;i他们声称,如果保持Size*Iterations不变,则增加Size,当数组内存的大小增加到超过L2高速缓存大小时,它们会观察到执行所需的巨大时间高峰(10x)。作为我自己的

c++ - 这是在序列点之间对同一对象的多次访问定义明确的行为吗?

是否允许多次访问?#includeintmain(){intA[1];A[0]=0;A[A[0]]=1;std::cout引用以下段落...Exceptwherenoted,theorderofevaluationofoperandsofindividualoperatorsandsubexpressionsofindividualexpressions,andtheorderinwhichsideeffectstakeplace,isunspecified.Betweenthepreviousandnextsequencepointascalarobjectshallhaveitss

c++ - 这是正确的行为吗? std::map 迭代器失效

#include#includeintmain(intargc,char**argv){std::mapmap;map.emplace(1,1);autoreverse_iter=map.rbegin();std::coutfirstsecondfirstsecond打印出来:1,12,2根据标准,这真的应该发生吗?我没有接触reverse_iter但它指向的值正在改变。我认为std::map中的迭代器应该可以安全地防止插入。然而,它似乎决定reverse_iter不再指向我告诉它的值,而是指向“此时map末尾发生的任何事情”。更新:更多信息,以防万一:前向迭代器似乎不会发生这种情况(